<?php
declare (strict_types = 1);

namespace app\middleware;

use think\facade\Db;
use think\Response;

class Init
{
    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    public function handle($request, \Closure $next)
    {
        //初始化常量
        $this->initConst();
        // 初始化配置
        $this->initConfig();
        return $next($request);
    }

    /**
     * 初始化常量
     */
    private function initConst()
    {
        // 初始化数据状态常量
        $this->initDataStatusConst();
        // 初始化时间常量
        $this->initTimeConst();
        // 初始化系统常量
        $this->initSystemConst();
        // 初始化路径常量
        $this->initPathConst();
    }

    /**
     * 初始化路径常量
     */
    private function initPathConst()
    {
        define('PATH_ADDON'             , root_path() . SYS_ADDON_DIR_NAME . DS);
        define('PATH_PUBLIC'            , root_path()   . 'public'    . DS);
        define('PATH_UPLOAD'            , PATH_PUBLIC . 'upload'    . DS);
        define('PATH_PICTURE'           , PATH_UPLOAD . 'picture'   . DS);
        define('PATH_FILE'              , PATH_UPLOAD . 'file'      . DS);
    }

    /**
     * 初始化系统常量
     */
    private function initSystemConst()
    {
        // 定义目录分隔符
        define('DS', DIRECTORY_SEPARATOR);
        define('SYS_APP_NAMESPACE'      , config('app.app_namespace'));
        define('SYS_HOOK_DIR_NAME'      , 'hook');
        define('SYS_ADDON_DIR_NAME'     , 'addon');
        define('SYS_DRIVER_DIR_NAME'    , 'driver');
        define('SYS_COMMON_DIR_NAME'    , 'common');
        define('SYS_STATIC_DIR_NAME'    , 'static');
        define('SYS_VERSION'            , '0.0.1');
        define('SYS_ADMINISTRATOR_ID'   , 1);
        define('SYS_DS_PROS'            , '/');
        define('SYS_DS_CONS'            , '\\');
        define('THINK_START_TIME'       , microtime(true));
        define('THINK_START_MEM'        , memory_get_usage());
    }

    /**
     * 初始化数据状态常量
     */
    private function initDataStatusConst()
    {
        define('DATA_NORMAL'            , 1);
        define('DATA_DISABLE'           , 0);
        define('DATA_DELETE'            , -1);
        define('DATA_SUCCESS'           , 1);
        define('DATA_ERROR'             , 0);
        define('LIMIT',10);
    }

    /**
     * 初始化时间常量
     */
    private function initTimeConst()
    {

        define('TIME_CT_NAME'           , 'create_time');
        define('TIME_UT_NAME'           , 'update_time');
        define('TIME_NOW'               , time());
    }
    /**
     * 初始化配置信息
     */
    private function initConfig()
    {
        $config_list = Db::name('config')->select();
        $config_array = [];
        foreach ($config_list as $info) {
            $config_array[$info['name']] = $info['value'];
        }
        config($config_array,'config');
    }
}
